﻿// ------------------------------------------------------------------------
// 项目名称：Canroc.Net 
// 版权归属：Canroc（https://gitee.com/canroc）
//
// 许可证信息
// Canroc.Net项目主要遵循 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-APACHE 文件。
//
// 使用条款：
// 1.使用本项目应遵守相关法律法规和许可证的要求。
// 2.不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动。
// 3.任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任
//
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
//
// 其他重要信息
// Canroc.Net 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// ------------------------------------------------------------------------

using Canroc.Net.Application.SysOrgService.Dto;

// ReSharper disable once CheckNamespace
namespace Canroc.Net.Application.SysOrgService;

/// <summary>
///     组织机构应用服务
/// </summary>
[ApiDescriptionSettings("System")]
public partial class SysOrgAppService(SqlSugarRepository<SysOrg> orgRep) : IDynamicApiController, ITransient
{
    /// <summary>
    ///     添加组织机构
    /// </summary>
    /// <param name="data">表单数据</param>
    /// <returns></returns>
    public async Task<bool> AdditionAsync(OrgInput data)
    {
        var entity = data.Adapt<SysOrg>();
        return await orgRep.InsertAsync(entity);
    }

    /// <summary>
    ///     编辑组织机构
    /// </summary>
    /// <param name="data">表单数据</param>
    /// <returns></returns>
    public async Task<bool> EditAsync(OrgInput data)
    {
        var entity = await orgRep.GetByIdAsync(data.Id);
        // 更新数据
        data.Adapt(entity);
        return await orgRep.UpdateAsync(entity);
    }

    /// <summary>
    ///     编辑组织机构状态
    /// </summary>
    /// <param name="data">请求参数</param>
    /// <returns></returns>
    public async Task<bool> EnableAsync(InputModel data)
    {
        return await orgRep.UpdateAsync(o => new SysOrg { IsEnable = SqlFunc.IIF(o.IsEnable, false, true) },
            o => o.Id == data.Id);
    }

    /// <summary>
    ///     删除组织机构
    /// </summary>
    /// <param name="data">请求参数</param>
    /// <returns></returns>
    public async Task<bool> DelAsync(DeleteInputModel data)
    {
        return await orgRep.UpdateAsync(o => new SysOrg { IsDelete = true }, o => data.Ids.Contains(o.Id));
    }

    /// <summary>
    ///     获取组织机构
    /// </summary>
    /// <param name="id">主键</param>
    /// <returns></returns>
    public async Task<OrgOutput?> GetDataAsync(Guid id)
    {
        return await orgRep.AsQueryable().Where(o => o.Id == id).Select<OrgOutput>().FirstAsync();
    }

    /// <summary>
    ///     获取组织机构列表
    /// </summary>
    /// <param name="query">查询参数</param>
    /// <returns></returns>
    public async Task<List<OrgOutput>?> GetTreeAsync([FromQuery] OrgQuery query)
    {
        return await orgRep
            .AsQueryable()
            .WhereIF(!query.Name.IsNullOrEmpty(), o => o.Name.Contains(query.Name))
            .WhereIF(query.IsEnable.HasValue, o => o.IsEnable == query.IsEnable)
            .Select<OrgOutput>()
            .ToTreeAsync(o => o.Children, o => o.Pid, Guid.Empty, o => o.Id);
    }

    /// <summary>
    ///     获取组织机构联级选项
    /// </summary>
    /// <returns></returns>
    public async Task<List<CascaderOptionOutputModel>?> GetCascaderOptionAsync()
    {
        return await orgRep
            .AsQueryable()
            .Where(o => o.IsEnable)
            .OrderBy(o => o.Sort)
            .ToCascaderOptionTreeAsync(o => o.Id, o => o.Pid, o => o.Name, Guid.Empty, o => o.Sort);
    }
}